\section{Préemption}

    Nous avons abordé le problème de la préemption. Le code correspondant est 
    dans le fichier \textbf{preemption.c}. Notre code d'exemple lance deux threads.
    Chacun des deux threads exécute une boucle d'un million d'itération,
    et affiche son numéro ("1" ou "2") toutes les cent milles itération.\\
    \\
    Dans notre précédente implémentation, le passage de la main (thread\_yield)
    par le thread s'effectuait en fin de la fonction appelée par le thread (threadfunc).
    Ici pour simuler une préemption, et donc un passage de main automatique, on souhaite
    qu'un thread n'occupe le processus pas plus d'une seconde. Toutes les secondes le thread lancé
    passe la main au bout d'une seconde d'exécution. \\
    \\
    Pour cela on utilise la fonction \textbf{setitimer} qui nous permet de spécifier un
    délai en seconde, délai qui se décrémente en temps réel et déclenche un signal
    lorsqu'il atteint zéro. Puis se repositionne à la valeur de départ et se re-décrémente,
    et ainsi de suite. Le signal appelle donc une fonction toute simple qui déclenche
    un \textbf{thread\_yield}\\
    \\
    Exemple de préemption avec 3 threads :
    \begin{center}
	\includegraphics[scale=0.6]{pictures/preemption2.png}
	\end{center}
	
	L'alternance entre les 3 threads se déroule bien toutes les secondes.
	Concernant les derniers tours de boucles, le thread "1" termine, il n'attends donc
	pas le timer pour passer la main au thread "2" qui termine également. Puis le timer déclenche une
	interruption et le thread "3" termine.
